package jus.aor.talk.v2;

import java.rmi.RemoteException;
import java.rmi.server.RemoteObject;
import java.rmi.server.UnicastRemoteObject;

import jus.aor.talk.Message;
import jus.aor.talk.MessageStop;
import jus.aor.talk.ui.client._IntervenantComposant;
import jus.aor.talk.ui.client._TalkEventIntervenantAdaptator;
import jus.util.assertion.Require;


/**
* La classe Intervanant implante un utilisateur du forum de discussion.
* ce type d'objet peut être distribué sur le réseau
* @version 	1.0, 30/11/98
* @author	Philippe Morat
* @email	Philippe.Morat@imag.fr
* @see		Forum
*/
public class Intervenant extends UnicastRemoteObject implements _IntervenantComposant, IntervenantInterface {
	/**
	 * 
	 */
	private static final long serialVersionUID = -7077401624316909897L;
	/**
	* le forum de discussion pour cet intervenant
	*/
	protected ForumInterface forum;
	
	/**
	* le nom de cet intervenant
	*/
	protected String nom;
	/**
	* le prénom de cet intervenant
	*/
	protected String prenom;
	/**
	* la propriété adaptator utilisée en interface du GUI
	*/
	protected transient _TalkEventIntervenantAdaptator adaptator;
	public void setAdaptator(_TalkEventIntervenantAdaptator adaptator) {
		this.adaptator=adaptator;
	}
	/**
	* l'identification affecté à ce client dans le forum de discussion
	* doit être systématiquement fourni au Forum lors de demande de service
	*/
	protected Integer forumId;
	/**
	* constructeur d'un intervenant
	*/
	public Intervenant() throws RemoteException {
	}
	/**
	* constructeur d'un intervenant
	* @require argsValide : prenom!=null && nom!=null
	*/
	public Intervenant(String prenom, String nom) throws Require, RemoteException {
		init(prenom,nom);
	}
	/**
	* initialisation d'un intervenant
	* @require argsValide : prenom!=null && nom!=null
	*/
	public void init(String prenom, String nom) throws Require {
		if(prenom==null || nom==null) {throw new Require(this.getClass()+" : Intervenant");}
		this.prenom=prenom;
		this.nom=nom;
	}
	/**
	* abonnement à un forum de discussion
	* @require argumentValide : forum!=null
	* @require etatValide : this.forum==null
	*/
	public boolean enter(String forum) throws Require {
		Integer id;
		ForumInterface f = null;
		if(forum==null || this.forum!=null) {throw new Require(this.getClass()+" : enter");}
		// recherche du forum à partir de sa pseudo URL
		f = Client.searchForum(forum);
		try {
			id=f.enter(this,prenom,nom);

			if(id.intValue()>0) {
				this.forum=f;
				this.forumId=id;
			}
		
			return this.forum!=null;
		}
		catch(Exception e) {
			System.out.println(e);
			return false;
		}
	}
	/**
	* résiliation du forum de discussion
	* @require etatValide : this.forum!=null
	*/
	public boolean leave() throws Require  {
		if(this.forum==null) {throw new Require(this.getClass()+" : leave");}
		try {
			if(forum.leave(forumId)) {
		
				forum = null;
			}
			return this.forum==null;
		}
		catch(Exception e) {
			System.out.println(e);
			return false;
		}
	}
	/**
	* mise ne vacation de l'intervenant aupr�s du forum de discussion
	* @require etatValide : this.forum!=null
	*/
	public boolean vacation() throws Require  {
		// dans cette version au réduit la vacation à "leave"
		return leave();
	}
	/**
	* terminaison de  l'intervenant
	* @require etatValide : this.forum==null
	*/
	public void quit() throws Require  {
		if(this.forum!=null) {throw new Require(this.getClass()+" : quit");}
		System.exit(0);
	}
	/**
	* envoi d'une participation au forum de discussion
	* @require argumentValide : participation!=null
	* @require etatValide : this.forum!=null
	*/
	public void say(String participation) throws Require  {
		try {
			if(participation==null || this.forum==null) {throw new Require(this.getClass()+" : say");}
			forum.say(forumId, participation);
		}
		catch(Exception e) {
			System.out.println(e);
		}
	}
	/**
	* demande de la liste des participants au forum de discussion
	* @require etatValide : this.forum!=null
	*/
	public String who() throws Require {
		try {
			if(this.forum==null) {throw new Require(this.getClass()+" : who");}
			Message message=forum.who(forumId);
			return message+"\n";
		}
		catch(Exception e) {
			System.out.println(e);
			return e.getMessage();
		}
	}
	/**
	* réception d'un message en provenance du forum
	* @require messageValide : message!=null
	* @require etatValide : this.forum!=null
	*/
	public synchronized void listen(Message message) throws Require  {
		if(message==null /*|| this.adaptator == null*/) {throw new Require(this.getClass()+" : listen : message " + message + " | adaptator : " + this.adaptator);}
		this.adaptator.listen(message+"\n");
	}
	/**
	 * réception d'un message d'arrêt du forum
	 * @param message
	 * @throws PreCondition
	 */
	public void stop(MessageStop message) throws Require {
		forum = null;
		adaptator.gotoState1();
	}
}